package domain

import (
	"fmt"
)

// 所有类及之间的关系已经设计好
// 需要将所有类组装在一起 提供一个执行入口
// 给外部使用提供的API接口

type ApiAuthencator interface {
	AuthByUrl(url string)
	AuthByApi(apiRequest ApiRequest)bool
}


// ApiAuthencator的默认实现
type DefaultApiAuthencatorImpl struct {
	credentialStorage CredentialStorage  // 属性有 credentialStorage 用于存储
}
// 构造函数
func NewApiAuthencator(storage CredentialStorage)ApiAuthencator{
	return &DefaultApiAuthencatorImpl{
		credentialStorage: storage,
	}
}



// 实现ApiAuthencator 注意 这里是 *DefaultApiAuthencatorImpl实现了 ApiAuthencator
func (this *DefaultApiAuthencatorImpl)AuthByUrl(url string){
	apiRequest:=ParseFromFullUrl(url)
	this.AuthByApi(apiRequest)
}

func (this *DefaultApiAuthencatorImpl)AuthByApi(apiRequest ApiRequest)bool{
	token:=apiRequest.GetToken()
	appId:=apiRequest.GetAppId()
	timestamp:=apiRequest.GetTimestamp()
	baseUrl:=apiRequest.GetBaseUrl()

	clientAuthToken:=NewAuthToken(token,timestamp,0)

	// 过期
	if clientAuthToken.IsExpired(){
		panic("token已经过期")
	}
	// 获取密码
	password:=this.credentialStorage.GetPasswordByAppId(appId)
	// 根据加密算法 生成token
	params :=make(map[string]string)
	params["password"]=password
	params["appId"]=appId
	serverAuthToken:=Create(baseUrl,timestamp,params)

	// 判断两个token是否一致
	match := serverAuthToken.Match(clientAuthToken)
	fmt.Println(match)
	return match
}